package quit

import (
	"os"
	"os/signal"
	"syscall"
)

/*
	quit 包提供了一个通用的进程优雅退出机制
	进程完成启动初始化之后，可以调用 quit.Wait() 进入等待状态
	当需要退出时调用 quit.Exit() 可以使 quit.Wait() 返回并退出等待状态
	之后执行关闭逻辑并退出
	quit.WatchStdKillSignal() 可以监听通用退出信号并自动调用 quit.Exit()
	通用退出信号包括 syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL, syscall.SIGTERM
*/

var existmessage = make(chan int, 1)

// Exit 退出
func Exit() {
	existmessage <- -1
}

// Wait 等待退出
func Wait() {
	<-existmessage
}

// WatchStdKillSignal 监听通用退出信号并且退出
// 通用退出信号包括 syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL, syscall.SIGTERM
func WatchStdKillSignal() {
	go func() {
		c := make(chan os.Signal)
		signal.Notify(c, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL, syscall.SIGTERM)
		<-c
		Exit()
	}()
}
